package com.supor.aiot.common.interfaces;

import com.alibaba.fastjson.JSONObject;

/**
 * ---------------------------------------------------------------- <br>
 * Copyright (C) 2014-2020, by het, Shenzhen, All rights reserved.  <br>
 * ---------------------------------------------------------------- <br>
 * <p>
 * 描述: 原生和H5交互接口 <br>
 * 作者: lei <br>
 * 日期: 2020/9/5 <br>
 */
public interface ISuporPresenter {
    /************************** native to H5 ************************/

    /**
     * 返回分享结果
     * <p>result	int	    分享结果返回:
     * <p>                  0x1分享成功
     * <p>                  1001用户取消
     * <p>                  1002认证失败
     * <p>                  1003其他异常
     * <p>                  40501应用未安装
     * <p>                  40502文件解析错误
     * <p>msgId	    long    当前状态是分享下发时传递的msgId,选填
     * <p>time	    long	时间戳,选填
     *
     * @param result
     */
    void reportShareStatus(int result);

    /**
     * 返回移动一键登录状态
     * 上报小程序端一键登录结果：登录成功携带用户基本信息，除了登录成功外小程序端需要处理用户点击其他方式
     * 登录和获取本机号码失败异常，都需要跳转验证码登录页面。原生端返回登录状态后自行销毁页面，登录相关提示由原生端展现。
     * <p>result	int	    登录结果返回:
     * <p>                  0x1登录成功
     * <p>                  0x2登录失败
     * <p>                  0x3用户点击其他方式登录
     * <p>                  0x4获取本机号码失败
     * <p>                  0x5按键返回（物理按键，虚拟按键）
     * <p>                  0x6无法识别sim卡或没有sim卡
     * <p>                  0x7其他异常
     * <p>userInfo	String  登录成功后返回用户信息，json格式字符串，其他情况不填
     * <p>time	    long	时间戳,选填
     *
     * @param result
     */
    void reportCmccLoginStatus(int result, String userInfo);

    /**
     * 上报产品配网结果
     * <p>上报小程序端产品配网绑定结果，配网失败由原生端提示处理，配网成功会返回机智云用户信息和设备信息，
     * <p>小程序端根据上报信息注册机智云websocket接口并订阅设备状态。
     * <p>result	String	 配网成功后返回机智云用户和设备信息，json格式字符串，结构如下：
     * <p>          {
     * <p>	            "thirdExpireAt": 1608197522,
     * <p>	            "thirdDid": "pjmmdGxxrZRmdeU36h4jDD",
     * <p>	            "thirdUid": "6ddaa7b0e0404bdcad76388b5fffdad6",
     * <p>	            "thirdToken": "160b7c7f39dd4dd694dc919be7fbbaa2"
     * <p>          }
     * <p>time	    long	时间戳,选填
     *
     * @param result
     */
    void reportConfigNetworkStatus(String result);

    /**
     * 上报NFC参数
     * <p>手机触碰NFC读取到record的数据，上报至小程序，小程序端根据wifiMac判断设备是否绑定，
     * <p>若已绑定则跳转产品页面订阅设备状态，若未绑定需要查询设备是否已被其他用户绑定，
     * <p>若已被他人绑定则弹框提示是否需要重新绑定，若未被他人绑定则直接跳转原生页面进行绑定。
     * <p>params	String	 触碰NFC获取的record参数，格式如下：
     * <p>          {
     * <p>              "sn": “16081975221234123”,
     * <p>	            "wifiMac": "123456654321",
     * <p>	            "isWifiConnect": "1",
     * <p>	            "count": "00a1"
     * <p>          }
     * <p>time	    long	时间戳,选填
     *
     * @param params
     */
    void reportNFCParams(String params);

    /**
     * 上报文件下载状态
     * 原生下载文件状态上报至小程序
     * <p>params	String	 文件下载状态数据，格式如下：
     * <p>{
     * <p>  "status": 0,
     * <p>  "progress": 10,
     * <p>  "total": 100,
     * <p>  "msg": ""
     * <p>}
     * <p>status：下载状态 0-下载中|1-下载完成|2-下载失败；
     * <p>progress：进度，int类型；
     * <p>total：总长度，int类型；
     * <p>msg：下载成功的值为下载文件的本地路径，下载失败的值为失败原因，String类型；
     *
     * @param params
     */
    void reportDownloadStatus(String params);

    /**
     * 上报权限申请结果
     * 动态申请权限结果后上报至小程序。
     * <p>result	int	    权限申请结果返回:
     * <p>                  1 权限申请成功
     * <p>                  2 权限申请失败
     * <p>type	    int	    权限类型：
     * <p>                  1 相机权限
     * <p>                  2 存储权限
     * <p>                  3 电话权限
     * <p>                  4 定位权限
     */
    void reportPermission(int result, int type);

    /**
     * 上报用户注销
     * 动态申请权限结果后上报至小程序。
     * <p>result	int	    1 用户不存在即用户已注销
     * <p>                  2 用户已退出登录
     */
    void reportCloseAccount(int result);

    /**
     * 上报设备绑定状态
     * <p>多点登录时同步设备列表，单点有绑定操作时后台会推送消息至所有端点，
     * 原生端收到绑定状态消息后上报至小程序端，小程序需要重新拉取设备列表。
     * <p> status	int 	    设备绑定状态：
     * <p>                          1设备绑定；
     * <p>                          2设备解绑；
     * <p> mac	    String	    设备MAC地址或者唯一标识。
     * <p> did	    String	    机智云设备ID。
     */
    void reportBindStatus(int status, String mac, String did);

    /**
     * 上报设备在线状态
     * <p>APP收到机智云上线下线消息时主动上报。
     * <p>  mac	    String	    设备MAC地址或者唯一标识。
     * <p>  did	    String	    机智云设备ID。
     * <p>  online	int	        设备在线状态：
     * <p>                          0设备不存在
     * <p>                          1在线
     * <p>                          2离线
     */
    void reportOnline(String mac, String did, int online);

    /**
     * 上报标准数据点通知
     * <p>设备收到读取指令或状态发生变化后，会主动发送当前状态到机智云云端，机智云云端向APP转发JSON字符串。
     * <p>  mac	    String	    设备MAC地址或者唯一标识。者唯一标识。
     * <p>  did	    String	    机智云设备ID。
     * <p>  value	String	    标准数据点协议，格式参照机智云websocket文档。
     * <p>
     * <p>
     * <p>
     */
    void reportCmd(String mac, String did, String value);

    /**
     * 上报绑定的设备列表
     * <p>APP从后台获取到绑定设备列表后主动上报绑定的设备树。
     * <p>  device	String	是	绑定设备列表树，树结构如下：
     * <p>  {
     * <p>  	"thirdExpireAt": 1632708793,
     * <p>  	"thirdUid": "xxx",
     * <p>  	"thirdToken": "xxx",
     * <p>  	"device": [
     * <p>  		{
     * <p>  			"did": "xxx",
     * <p>  			"mac": "245DFC6347C7",
     * <p>  			"status": false,
     * <p>  			"devAlias": "",
     * <p>  			"ip": "122.224.37.74",
     * <p>  			"wifiSoftVersion": "04020047",
     * <p>  			"onoffStatus": true,
     * <p>  			"netDbm": 0,
     * <p>  			"model": "SY-50MT01",
     * <p>  			"type": "EPC",
     * <p>  			"machineVer": 1,
     * <p>  			"busy": false
     * <p>  		},...]
     * <p>  }
     * <p>
     */
    void reportDeviceTree(String device);

    /**
     * 向小程序上报评论烹饪记录评论结果
     *
     * @param recipeId 食谱id
     * @param commType 评论type
     */
    void reportRecipeCommInfo(String recipeId, int commType);

    /**
     * 上报智定义食谱写入状态
     * <p>本地智定义食谱写入成功之后需上传给小程序
     * <p> status	int 	    设备绑定状态：
     * <p>                          1写入成功；
     * <p>                          0写入失败；
     */
    void reportNFCWriteStatus(int status);

    /**
     * 上报最新的UID给小程序，小程序更新此UID
     * <p> 原生端请求接口更新UID成功后上报给小程序
     * <p> newMac	String 	 碰一碰NFC模块获取到的UID
     */
    void reportNewMac(String newMac);

    /**
     * 上报分享方式
     * <p>原生端上报小程序手机支持的分享方式（微信，微博和抖音是否安装）。
     * 小程序根据上报的支持的分享方式调整UI，不支持的分享方式隐藏对应的UI入口（规避IOS的审核问题）。
     * <p> wxInstalled	    int	    0表示微信未安装 ；1表示微信已安装；
     * <p> dyInstalled	    int	    0表示抖音未安装 ；1表示抖音已安装；
     * <p> wbInstalled	    int	    0表示微博未安装 ；1表示微博已安装；
     */
    void reportShareChannel();


    /**
     * 上报外设状态
     */
    void reportCupCondition(String cValue);

    /************************** H5 to native ************************/
    /**
     * 查询设备在线状态
     * <p>小程序端主动查询设备状态。
     * <p>  mac	    String	    设备MAC地址或者唯一标识。
     * <p>  返回：
     * <p>  online	int		    设备在线状态：
     * <p>                          0设备不存在
     * <p>                          1在线；
     * <p>                          2离线；
     */
    void sendOnline(String mac);

    /**
     * 设置标准数据点
     * <p>对应设备协议标准数据点读和写操作，如果有数据返回则通过reportCmd接口上报
     * <p>  cmd	    int	    是	设置类型：
     * <p>                          1写操作；
     * <p>                          2读操作；
     * <p>  mac	    String	是	设备MAC地址或者唯一标识。
     * <p>  did	    String	否	机智云设备ID。
     * <p>  value	String	是	标准数据点协议，格式参照机智云websocket文档。
     */
    void sendCmd(int cmd, String mac, String did, String value);

    /**
     * 分享
     * <p>shareType	    int	        分享类型：0-取消分享|1-微信|2-微信朋友圈|3-QQ好友|4-QQ空间|5-微博|6-支付宝|7-抖音
     * <p>title	        String	    自定义分享标题
     * <p>desc	        String	    自定义分享描述：由于分享到微博只支持最大长度 140 个字，因此建议长度不要超过该限制。
     * <p>path	        String	    自定义分享页面的路径，path 中的自定义参数可在小程序生命周期的 onLoad 方法中获取（参数传递遵循 http get
     * 的传参规则）。客户端实现分享场景时，该字段在原生代码的名称对应为 page 。
     * <p>imageUrl	    String	    自定义分享小图标元素，支持网络图片路径、apFilePath 路径和相对路径。使用场景详见mPaaS小程序分享文档。
     * <p>bgImgUrl	    String	    自定义分享预览大图，建议尺寸 750x825，支持网络图片路径、apFilePath
     * 路径和相对路径。使用场景详见mPaaS小程序分享文档。
     * <p>msgId	        long	    全局消息ID，用于区分原生端上报是否处于主动下发指令状态,选填
     * <p>time	        long	    时间戳,选填
     *
     * @param jo all content
     */
    void sendShareMsg(JSONObject jo);

    /**
     * 显示导航栏
     * <p>visibility	    int     是否显示导航栏
     * <p>                          0x0不显示
     * <p>                          0x1显示
     * <p>time	            long	时间戳,选填
     *
     * @param visibility 是否显示导航栏
     */
    void sendShowNavigationBar(int visibility);

    /**
     * 设置用户基本信息：当小程序登录成功或者进入小程序首次获取到用户信息即调用此接口，原生端收到用户信息需要调用mPaaS框架报活用户接口
     * <p>userId    String      用户ID
     * <p>phone     String      用户手机号
     * <p>email     String      用户邮箱
     *
     * @param jo 用户信息
     * @deprecated
     */
    void sendUserInfo(JSONObject jo);

    /**
     * 移动一键登录
     * <p>小程序端调用一键登录，原生端唤起移动登录SDK授权页面。
     * <p>state	    int	        调用登录状态：1-登录|0-取消登录
     * <p>time	    long	    时间戳
     *
     * @param state 登录状态
     */
    void sendCmccAuthLogin(int state);

    /**
     * 获取APP状态信息
     * <p>获取APP状态信息包括：APP版本，小程序版本，是否首次打开APP，是否已授权隐私条款等。
     * <p>注意：状态信息是接口直接返回。
     */
    void sendGetAppInfo(JSONObject jo);

    /**
     * 设置APP状态信息，目前包括：小程序版本，是否已授权隐私条款。
     * <p>state	            int	        调用登录状态：1-登录|0-取消登录
     * <p>exit	            int	        是否退出APP：1表示退出APP，0表示不退出
     * <p>tinyVersion	    String	    小程序版本
     * <p>authPrivacyPolicy	int	        1表示已授权隐私协议，0表示未授权隐私协议
     * <p>time	            long        时间戳
     *
     * @param jo APP状态信息
     */
    void sendSetAppInfo(JSONObject jo);

    /**
     * 切换服务器环境：三个环境切换，和而泰测试环境、苏泊尔测试环境和正式环境.
     * <p>server    int	    服务器环境： 0苏泊尔正式环境|1苏泊尔测试环境|2和而泰开发环境
     * <p>time	    long    时间戳
     *
     * @param server 服务器环境
     */
    void sendSwitchServer(int server);

    /**
     * 小程序端存取信息到原生端
     * <p>type	        int         存取状态：
     * <p>                          0获取保存信息（小程序获取原生保存的信息）
     * <p>                          1存储信息（小程序保存信息至原生）
     * <p>saveInfo	    String	    保存的信息，json字符串格式
     * <p>time	        long        时间戳
     *
     * @param jo 存取信息
     */
    void sendSaveInfo(JSONObject jo);

    /**
     * 产品配网绑定
     * <p>配网绑定：目前支持NFC配网和AP配网，配网绑定成功会上报配网结果。
     * <p>type	int     跳转类型：
     * <p>              0 NFC配网
     * <p>              1 SoftAP配网
     * <p>              2 扫一扫
     * <p>time	long    时间戳
     *
     * @param jo 存取信息
     */
    void sendConfigNetwork(JSONObject jo);

    /**
     * 设置H5页面显示
     * <p>设置原生展示H5页面。
     * <p>type	int     显示类型：
     * <p>              0 H5页面自带标题栏，需原生适配状态栏
     * <p>              1 H5页面不带标题栏，需原生添加标题栏
     * <p>url	string	H5页面url地址
     * <p>time	long    时间戳
     *
     * @param jo 存取信息
     */
    void sendUrlDisplay(JSONObject jo);

    /**
     * 申请系统权限
     * <p>小程序动态申请系统权限，安卓使用。此接口需要和reportPermission接口配套使用，
     * <p>调用权限申请的结果在reportPermission接口返回
     * <p>type	int     权限类型：
     * <p>                  1 相机权限
     * <p>                  2 存储权限
     * <p>                  3 电话权限
     * <p>                  4 定位权限
     * <p>time	long    时间戳
     *
     * @param jo 权限
     */
    void sendRequestPermission(JSONObject jo);

    /**
     * 反馈
     * <p>小程序调用原生反馈页面。
     * <p>time	long    时间戳
     */
    void sendFeedback();

    /**
     * 保存APP版本信息
     * APP升级，原生端保存版本信息。
     * <p>
     * <p>state	    int     状态：
     * <p>                  1 取消升级
     * <p>                  2 升级
     * <p>params	String  版本信息，结构为后端返回格式
     */
    void sendSaveUpgradeInfo(int state, String params);

    /**
     * 获取APP版本信息
     * <p>小程序获取原生端保存的版本版本信息，如果获取的版本信息为空表示未保存过版本信息，
     * <p>若不为空则表示此版本为用户取消升级的版本。
     */
    void sendGetUpgradeInfo();

    /**
     * 小程序调用原生页面
     * <p>type	    int	    是	    页面类型：0 退出小程序|1 家庭页|2 菜篮子|3 烹饪记录列表|4 烹饪记录评价详情|5 烹饪记录评价填写|6 登录页|7 主厨页
     * <p>params	String	否	    参数字段，json格式
     */
    void sendStartPage(JSONObject jo);

    /**
     * 状态改变通知
     * <p>小程序通知原生状态改变，原生根据状态改变做相应处理。
     * <p>type	    int	    是	    状态类型：0 无状态|1 设备更改名称
     * <p>params	String	否	    参数字段，json格式
     */
    void sendStateChange(JSONObject jo);

    /**
     * 状态改变通知
     * <p>小程序通知抖菜原生页面，原生根据状态改变做相应处理。
     * <p>type	    int	    是	    状态类型：0 无状态|1 添加评论|2 添加食谱收藏|3 取消食谱收藏
     * <p>params	String	否	    参数字段，json格式
     */
    void sendTikRecipeStateChange(JSONObject jo);

    /**
     * 状态改变通知
     * <p>小程序开启单视频抖菜页
     * <p>type	    int	    是	    状态类型：0 无状态|1 开启单视频抖菜页
     * <p>params	String	否	    参数字段，json格式
     */
    void sendTikRecipePageStart(JSONObject jo);

    /**
     * <p>小程序下发NFC版本免手洗破壁机数据
     * <p>params	String	否	    参数字段，json格式 主要字段 data: ""
     */
    void sendNFCBlender(JSONObject jo);

    /**
     * <p>显示toast
     * <p>type	    int	    是	    状态类型：0 无状态|1 开启单视频抖菜页
     * <p>params	String	否	    参数字段，json格式 主要字段 title: ""
     */
    void showToast(JSONObject jo);

    /**
     * <p>添加日历事件
     */
    long addToCalendar(JSONObject jo);

    /**
     * <p>删除日历事件
     */
    void removeFromCalendar(JSONObject jo);
}
